#ifndef LIST_H_
#define LIST_H_

/*头文件*/
#include <stdlib.h>		//< NULL标识在这里定义
#include <memory>		//< calloc函数头文件


/*链表操作返回值枚举*/
typedef enum
{
	LIST_OK,			//< 成功
	LIST_MEMFAIL,		//< 内存操作失败
	LIST_IDEXIT,		//< ID存在
	LIST_IDNON,			//< ID不存在
}List_Info_e;


/*自写链表相关宏定义*/
#define TYPE(name)			TYP_##name							//< 获取链表元素类型
#define LIST_NAME(name)		name##_t							//< 获取链表头元素结构体指针
#define ELE_PNT(name)		((void**)&LIST_NAME(name))			//< 获取链表头地址
#define ELE_LEN(name)		(sizeof(struct name##_T))			//< 获取链表元素长度
#define NAME(name)			name##_T							//< 获取链表头元素结构体类型
#define FREE_Pt(p)			myfree_Pt((void **)&p)				//< 内存空间释放（指针变量）		




/*定义存放自写链表信息的结构体*/
typedef struct {
	void** ppData;				//< 存放链表头元素地址的地址
	int Type;					//< 链表所存储的元素的类型
	int iEleLen;				//< 该类型链表元素单个元素的字节数
	int iCount;					//< 链表存储元素数量计数
	void* List_Par;				//< 链表所包含的私有参数结构体指针
	void* List_Func;			//< 链表所包含的私有函数结构体指针
}List_Tab_t;


/*链表基本信息结构体*/
typedef struct List_Base_T {
	unsigned int ID;			//< 元素ID号，同一链表内的所有元素ID号都不同
	List_Base_T* Next;			//< 下一个节点指针
}List_Base_t;


/*自写链表操作公共函数*/
List_Base_t* SearchId(List_Base_t* _base, unsigned int ID);				//< 寻找链表中指定ID号的元素并返回 （数据库、SAMA）
List_Base_t* SearchAt(List_Base_t* _base, int Index);					//< 寻找链表中指定位置的元素并返回  (TCP、UDP、协议)
List_Info_e AddElement(List_Tab_t* arg, unsigned int ID);				//< 链表中增加指定ID号的元素
List_Info_e DelElement(List_Tab_t* arg, unsigned int ID);				//< 链表中删除指定ID号的元素
void myfree_Pt(void ** point);											//< 内存释放函数


#endif
